$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

C++
C#

Асоцијативни низови (мапе, речници)

Програмски језик C++ пружа подршку за креирање мапа (речника, асоцијативних низова) који представљају колекције података у којима се кључевима неког типа придружују вредности неког типа (не обавезно истог). На пример, именима месеци (подацима типа string) можемо доделити број дана (податке типа int). Речници се представљају објектима типа map<TipKljuca, TipVrednosti>, дефинисаном у заглављу <map>. На пример,

map<string, int> brojDana =
{
    {"januar", 31},
    {"februar", 28},
    {"mart", 31},
    ...
};

Приметимо да смо иницијализацију мале извршили тако што смо навели листу парова облика {kljuc, vrednost}. Иницијализацију није неопходно извршити одмах током креирања, већ је вредности могуће додавати (а и читати) коришћењем индексног приступа (помоћу заграда []).

map<string, int> brojDana;
brojDana["januar"] = 31;
brojDana["februar"] = 28;
brojDana["mart"] = 31;
...

Мапу, дакле, можемо схватити и као низ тј. вектор у коме индекси нису обавезно из неког целобројног интервала облика \([0,n)\), већ могу бити произвољног типа.

Претрагу кључа можемо остварити методом find која враћа итератор на пронађени елемент тј. итератор иза краја мапе (који добијамо методом или функцијом end), ако елемент не постоји. На пример,

string mesec; cin >> mesec;
auto it = brojDana.find(mesec);
if (it != end(brojDana))
   cout << "Broj dana: " + *it << endl;
else
   cout << "Mesec nije korektno unet" << endl;

Све елементе речника могуће је исписати коришћењем петље for. На пример,

for (auto& it : brojDana)
     cout << it.first << ": " << it.second << endl;

Алтернативно, можемо експлицитно користити итераторе

for (auto it = brojDana.begin(); it != brojDana.end(); it++)
     cout << it->first << ": " << it->second << endl;

Итерација се врши у сортираном редоследу кључева.

Постоји и облик неуређене мапе (unordered_map из истоименог заглавља), која може бити у неким ситуацијама мало бржа него уређена (сортирана) мапа, но то је обично занемариво. Кључеви сортиране мапе могу бити само они типови који се могу поредити релацијским операторима, док кључеви неуређене мапе могу бити само они типови који се могу лако претворити у број (тзв. хеш-вредност). Ниске, које ћемо најчешће користити као кључеве, задовољавају оба услова.

Асоцијативни низови (мапе, речници)

Програмски језик C# пружа подршку за креирање речника (мапа, асоцијативних низова) који представљају колекције података у којима се кључевима неког типа придружују вредности неког типа (не обавезно истог). На пример, именима месеци (подацима типа string) можемо доделити број дана (податке типа int). Речници се представљају објектима типа Dictionary<TipKljuca, TipVrednosti> из библиотеке System.Collections.Generic. На пример,

var brojDana = new Dictionary<string, int>()
{
    {"januar", 31},
    {"februar", 28},
    {"mart", 31},
    ...
};

Приметимо да смо речник морали да креирамо помоћу кључне речи new и да смо након тога навели листу парова облика {kljuc, vrednost}. Речник није неопходно иницијализовати одмах током креирања, већ је вредности могуће додавати (а и читати) коришћењем индексног приступа (помоћу заграда []).

var brojDana = new Dictionary<string, int>();
brojDana["januar"] = 31;
brojDana["februar"] = 28;
brojDana["mart"] = 31;
...

Речник, дакле, можемо схватити и као низ тј. листу у коме индекси нису обавезно из неког целобројног интервала облика \([0,n)\), већ могу бити произвољног типа.

Проверу да ли је неком кључу придружена вредност у речнику можемо остварити методом ContainsKey (она враћа true ако и само је датом кључу придружена нека вредност). Уместо да прво проверавамо да је вредност кључа присутна а затим да читамо вредност тог кључа, могуће је користити метод TryGetValue који вредност чита само у једном обиласку речника (уместо у два). На пример,

string mesec = Console.ReadLine();
int broj;
if (TryGetValue(mesec, out broj))
   Console.WriteLine("Broj dana: " + broj);
else
   Console.WriteLine("Mesec nije korektno unet");

Све елементе речника могуће је исписати коришћењем петље foreach. На пример,

foreach (var x in brojDana)
     Console.WriteLine(x.Key + ": " + x.Value);

Редослед обиласка није лако унапред предвидети. Ако желимо да будемо сигурни да ће се кључеви обилазити у сортираном редоследу, можемо уместо Dictionary употребити SortedDictionary. Ова варијанта може бити мало спорија него Dictionary, али то је обично занемариво. Кључеви сортиране мапе могу бити само они типови који се могу поредити (методом CompareTo), док кључеви неуређене мапе могу бити само они типови који се могу лако претворити у број (тзв. хеш-вредност) методом GetHashCode. Ниске, које ћемо најчешће користити као кључеве, задовољавају оба услова.